Fix WIRE-385 stale outbound operator rosters - #603
Conversation
Change-Id: I2fe1bac5e738da09019a96deae976fe727638b4f
Review — WNS-34 / WIRE-385Verdict: the mechanism is correct and the change is close to minimal. One gap, on the Solana side, not in this PR. Mechanism verified
Depth is fine: On minimalityNothing here looks cuttable:
Worth recording: the primary WNS-34 path never withholds at all. A non-canonical-delivery slash targets an expiring-group member, which is erased wholesale — no hole, complete window, fresh roster published. Holes only arise from out-of-band removals ( Gap: the Solana outpost has the defect #198 fixes on Ethereumwire-ethereum#198 exists because "applying a newer
So whenever this PR withholds an incomplete window, Solana retains its previous window and keeps admitting the removed operator's The green e2e doesn't clear it: run Nits
Non-blocking: "emissions retain their … inline depth" in the description is loose — Checks run
|
…operator-rosters Change-Id: I2d08a6a1a29481a7539da287fab3ac5382f992fb
Change-Id: I439be98d6210bfa418560a680c3436d68f9dc266
Change-Id: I1eb6737adbf418e80a81783ff327a7b267e9e302
|
Thanks for the detailed review. I addressed the two SYSIO nits in follow-up commit
I also traced the Solana concern against the exact revisions. The cited membership-only behavior predates SOL-377. Commit The Ethereum companion is now at Validation on exact heads
Re-review is still requested from @heifner. |
Re-review — WNS-34 / WIRE-385My Solana finding was wrong — retracted. I read it off a local wire-solana checkout ( Both nits are closed in One outstanding item: a withheld window permanently stalls the outposts on a multi-group scheduleThe Solana program already names this failure as a rollout hazard (mod.rs:491-498): "
Envelope N is delivered by G_N, and the outpost learns "admit G_N" only from envelope N-1. Withhold once at N and the outpost still admits G_N when envelope N+1 arrives from G_{N+1} — disjoint by construction → refused. Trigger: ACTIVE batch ops below Not covered: contract tests can't observe outpost admission; Refusing to publish a short group is right — master's alternative shrinks the quorum denominator. But the trade is fail-open → fail-closed-and-unrecoverable, and the description ("withholding … until the roster is repaired", "Current-group vacancies require roster recovery") promises a recovery the mechanism can't deliver. Suggested direction: don't let duty advance past the group the outposts were last told about — commit the slide only when the previous window was published. The first withheld epoch is safe (that duty was already announced); freezing from the second keeps a full-size group serving, denominator intact, channel live until the roster is repaired. Failing that, say plainly in the deployment notes that a below-minimum roster on a multi-group window is terminal for the outposts. Otherwise clean
|
Tracking
WIRE-385WNS-34— Stale Operator Roster In Outbound Attestations Due To Inline Action OrderingWhy
sysio.epoch::advance()queued slashing and termination as inline actions, then generatedOPERATORSandBATCH_OPERATOR_GROUPSattestations before those mutations executed. A slashed or terminated operator could therefore be announced as active for the next epoch. External outposts could continue accepting that operator's signatures, creating a path to forged cross-chain messages, outpost compromise, or loss of locked funds.Pruning an ineligible operator could also leave a future schedule group empty. When that group became active, no operator could relay messages or advance cross-chain consensus even when healthy standbys were available. Publishing a shortened group was unsafe because it would reduce the outpost quorum denominator.
What changed
finishadvrereadssysio.opregand publishes the authoritative operator roster.OPERATORSbeforeBATCH_OPERATOR_GROUPS, remove ineligible members, and repair future vacancies from healthy standbys before selecting the next tail.flushwtdw,drainfwq, andpayepochat depth 2. The new terminalfinishadvsendsqueueout,buildenv,accrueepoch, andrcrdbatchat depth 3; those actions do not send further inline work.finishadvlog label and clarify that deferred maintenance observes the new epoch state afterstate_tbl.set.sysio.epochABI and WASM from the selected CDT build. The tracked WASM matches the passing source-build artifact byte for byte.The reviewer’s Solana concern is covered by the validated
origin/nextbase: SOL-377 commitb8fae4eechecks every seated signer against the live ACTIVE batch-operator roster, while the current base additionally scopes membership toactive_group_index. The old e2e Solana revision1c3f3ddalready contained SOL-377; no WIRE-385 Solana source change is needed.Validation
4cf466f, Ethereum17392d6, and Solanaeaebfc6, includingflow-batch-operator-slashingwith epoch-freeze monitoring.Deployment notes
Deploy the Ethereum companion in the fresh pre-launch environment first: https://github.com/Wire-Network/wire-ethereum/pull/198. No UUPS state migration is required. Current-group vacancies require roster recovery; incomplete windows remain withheld. Future-vacancy recovery can shorten normal duty spacing in larger schedules.